package com.cwz.datasource.generate;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.ArrayList;

/**
 * @program: w-demo
 * @description: myBatis-plus 类生成工具
 * @author: Wen
 **/
public class ClassGenerate {
	public static void main(String[] args) {
		// 我们需要构建一个代码生成器对象
		AutoGenerator mpg = new AutoGenerator();

		// 1. 全局配置
		GlobalConfig gc = new GlobalConfig();
		// 获取当前目录
		String projectPath = System.getProperty("user.dir");
		// 输出到哪个目录
		gc.setOutputDir(projectPath + "/src/main/java");
		gc.setAuthor("Wen");
		// 生成完代码是否打开资源管理器（就是文件夹）
		gc.setOpen(false);
		// 是否覆盖
		gc.setFileOverride(false);
		// 去Service的I前缀
		gc.setServiceName("%sService");
		gc.setIdType(IdType.AUTO);
		// 日期类型：仅仅只是时间
		gc.setDateType(DateType.ONLY_DATE);
		gc.setSwagger2(false);
		mpg.setGlobalConfig(gc);

		// 2. 设置数据源
		DataSourceConfig dsc = new DataSourceConfig();
		dsc.setUsername("root");
		dsc.setPassword("root");
		dsc.setUrl("jdbc:mysql://127.0.0.1:3366/w-demo?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2B8");
		dsc.setDriverName("com.mysql.cj.jdbc.Driver");
		dsc.setDbType(DbType.MYSQL);
		mpg.setDataSource(dsc);

		// 3. 包的配置
		PackageConfig pc = new PackageConfig();
		// 模块名，所有生成的代码都在这个模块里（就是一个外面的文件包），这里不需要配置
		//pc.setModuleName("");
		pc.setParent("com.cwz.datasource");
		pc.setEntity("entity");
		pc.setMapper("dao");
		pc.setXml("mapper");
		pc.setService("service");
		pc.setController("controller");
		mpg.setPackageInfo(pc);

		// 4. 策略配置
		StrategyConfig strategy = new StrategyConfig();
		// 设置要映射的表名,只需改这里即可
		strategy.setInclude("user_file", "user_path");
		// 下划线转驼峰
		strategy.setNaming(NamingStrategy.underline_to_camel);
		strategy.setColumnNaming(NamingStrategy.underline_to_camel);
		// 是否使用lombok开启注解
		strategy.setEntityLombokModel(true);
		// 逻辑删除字段
//		strategy.setLogicDeleteFieldName("deleted");
		// 自动填充配置
		ArrayList<TableFill> tableFills = new ArrayList<>();
		tableFills.add(new TableFill("deleted", FieldFill.INSERT));
//		tableFills.add(new TableFill("version", FieldFill.INSERT));
		tableFills.add(new TableFill("createTime", FieldFill.INSERT));
		tableFills.add(new TableFill("updateTime", FieldFill.INSERT_UPDATE));
		strategy.setTableFillList(tableFills);
		// 乐观锁配置
//		strategy.setVersionFieldName("version");
		// 配置 rest 风格的控制器（@RestController）
		strategy.setRestControllerStyle(true);
		// 开启驼峰命名（地址使用下划线：localhost:8080/hello_id_2）
		strategy.setControllerMappingHyphenStyle(true);
		mpg.setStrategy(strategy);
		// 执行
		mpg.execute();
	}
}
